用 numpy 进行快速傅立叶变换 fft

工程信号处理作业,用 matlab 对一个信号进行傅立叶变换,由于从没用过 matlab,所以想看看 python 能不能做,一查果然 numpy 有 fft 的函数。

fft 就是把信号在时域的采样的 N 个实数,变成时域的 N 个复数,具体的输入输出见这个youtube 视频.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import matplotlib.pyplot as plt

N = 1000 #采样点数
Td = 4 #采样总时间,采样总时间的倒数就是频谱的分辨率 df
fs = N/Td #采样频率

x = np.linspace(0,Td,N) #采样时域的坐标
y = np.sin(100*(x-2))/(50*(x-2)) #需要进行傅立叶变换的函数

freqx = np.fft.fftfreq(N,d=1/fs) #频域的坐标,采样 N 个点那么频域也有 N 个点,fftfreq 直接生成 N 个频域点的*实际*坐标
#fftfreqs 第二个参数 d 是采样频率的倒数,那么频谱分辨率 df=1/Td=1/(N/fs)=fs/N=1/(d*N)=1/Td

fft_vals = np.fft.fft(y) #未经处理的 fft 输出,幅度只有实际值的一半,而且未经过归一化
fft_theo = 2.0*np.abs(fft_vals/N) #根据公式,除以 N 归一化之后 abs 求幅度,再将幅度乘以 2 就是真实的幅度值


plt.figure(1)
plt.title('oringin signal')
plt.plot(x,y,color='red')
plt.xlabel('time(s)')
plt.show()

plt.figure(2)
plt.title('true fft output in frequency domain')
plt.plot(freqx, fft_theo)
plt.xlabel('frequency(Hz)')
plt.show()

微信捐赠
支付宝捐赠